using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._Visibility
{
    /// <summary>
    /// <para>Construct Sight Lines</para>
    /// <para>Creates line features that represent sight lines from one or more observer points to features in a  target feature class.</para>
    /// <para>创建线要素，用于表示从一个或多个观察点到目标要素类中的要素的视线。</para>
    /// </summary>    
    [DisplayName("Construct Sight Lines")]
    public class ConstructSightLines : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ConstructSightLines()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_observer_points">
        /// <para>Observer Points</para>
        /// <para>The single-point features that represent observer points. Multipoint features are not supported.</para>
        /// <para>表示观察点的单点要素。不支持多点功能。</para>
        /// </param>
        /// <param name="_in_target_features">
        /// <para>Target Features</para>
        /// <para>The target features (points, multipoints, lines, and polygons).</para>
        /// <para>目标要素（点、多点、直线和面）。</para>
        /// </param>
        /// <param name="_out_line_feature_class">
        /// <para>Output</para>
        /// <para>The output feature class containing the sight lines.</para>
        /// <para>包含视线的输出要素类。</para>
        /// </param>
        public ConstructSightLines(object _in_observer_points, object _in_target_features, object _out_line_feature_class)
        {
            this._in_observer_points = _in_observer_points;
            this._in_target_features = _in_target_features;
            this._out_line_feature_class = _out_line_feature_class;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Construct Sight Lines";

        public override string CallName => "3d.ConstructSightLines";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "ZDomain", "ZResolution", "ZTolerance", "autoCommit", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_observer_points, _in_target_features, _out_line_feature_class, _observer_height_field.GetGPValue(), _target_height_field.GetGPValue(), _join_field, _sample_distance, _output_the_direction.GetGPValue(), _sampling_method.GetGPValue()];

        /// <summary>
        /// <para>Observer Points</para>
        /// <para>The single-point features that represent observer points. Multipoint features are not supported.</para>
        /// <para>表示观察点的单点要素。不支持多点功能。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observer Points")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_observer_points { get; set; }


        /// <summary>
        /// <para>Target Features</para>
        /// <para>The target features (points, multipoints, lines, and polygons).</para>
        /// <para>目标要素（点、多点、直线和面）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_target_features { get; set; }


        /// <summary>
        /// <para>Output</para>
        /// <para>The output feature class containing the sight lines.</para>
        /// <para>包含视线的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_line_feature_class { get; set; }


        /// <summary>
        /// <para>Observer Height Field</para>
        /// <para><xdoc>
        ///   <para>The source of the height values for the observer points obtained from its attribute table.</para>
        ///   <para>A default Observer Height Field field is selected from among the options listed below by order of priority. If multiple fields exist, and the desired field does not have a higher priority in the default field selection, the desired field will need to be specified.</para>
        ///   <bulletList>
        ///     <bullet_item>No Height Source—No Z values will be assigned to the resulting sight line features.</bullet_item><para/>
        ///   </bulletList>
        ///   <bullet_item>Shape.Z</bullet_item><para/>
        ///   <bullet_item>Spot</bullet_item><para/>
        ///   <bullet_item>Z</bullet_item><para/>
        ///   <bullet_item>Z_Value</bullet_item><para/>
        ///   <bullet_item>Height</bullet_item><para/>
        ///   <bullet_item>Elev</bullet_item><para/>
        ///   <bullet_item>Elevation</bullet_item><para/>
        ///   <bullet_item>Contour</bullet_item><para/>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>从其属性表中获取的观察点的高度值的来源。</para>
        ///   <para>默认的“观察点高度字段”字段是按优先级顺序从下面列出的选项中选择的。如果存在多个字段，并且所需字段在默认字段选择中没有更高的优先级，则需要指定所需字段。</para>
        ///   <bulletList>
        ///     <bullet_item>无高度源 - 不会为生成的视线要素指定 Z 值。</bullet_item><para/>
        ///   </bulletList>
        ///   <bullet_item>形状.Z</bullet_item><para/>
        ///   <bullet_item>点</bullet_item><para/>
        ///   <bullet_item>Z</bullet_item><para/>
        ///   <bullet_item>Z_Value</bullet_item><para/>
        ///   <bullet_item>高度</bullet_item><para/>
        ///   <bullet_item>埃列夫</bullet_item><para/>
        ///   <bullet_item>海拔</bullet_item><para/>
        ///   <bullet_item>轮廓</bullet_item><para/>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observer Height Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _observer_height_field_value _observer_height_field { get; set; } = _observer_height_field_value.value0;

        public enum _observer_height_field_value
        {
            /// <summary>
            /// <para>No Height Source</para>
            /// <para>No Height Source—No Z values will be assigned to the resulting sight line features.</para>
            /// <para>无高度源 - 不会为生成的视线要素指定 Z 值。</para>
            /// </summary>
            [Description("No Height Source")]
            [GPEnumValue("<None>")]
            value0,

        }

        /// <summary>
        /// <para>Target Height Field</para>
        /// <para><xdoc>
        ///   <para>The height field for the target.</para>
        ///   <para>A default Target Height Field field is selected from among the options listed below by order of priority. If multiple fields exist, and the desired field does not have a higher priority in the default field selection, the desired field will need to be specified.</para>
        ///   <bulletList>
        ///     <bullet_item>No Height Source—No Z values will be assigned to the resulting sight line features.</bullet_item><para/>
        ///   </bulletList>
        ///   <bullet_item>Shape.Z</bullet_item><para/>
        ///   <bullet_item>Spot</bullet_item><para/>
        ///   <bullet_item>Z</bullet_item><para/>
        ///   <bullet_item>Z_Value</bullet_item><para/>
        ///   <bullet_item>Height</bullet_item><para/>
        ///   <bullet_item>Elev</bullet_item><para/>
        ///   <bullet_item>Elevation</bullet_item><para/>
        ///   <bullet_item>Contour</bullet_item><para/>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>目标的高度字段。</para>
        ///   <para>默认的“目标高度字段”字段是按优先级顺序从下面列出的选项中选择的。如果存在多个字段，并且所需字段在默认字段选择中没有更高的优先级，则需要指定所需字段。</para>
        ///   <bulletList>
        ///     <bullet_item>无高度源 - 不会为生成的视线要素指定 Z 值。</bullet_item><para/>
        ///   </bulletList>
        ///   <bullet_item>形状.Z</bullet_item><para/>
        ///   <bullet_item>点</bullet_item><para/>
        ///   <bullet_item>Z</bullet_item><para/>
        ///   <bullet_item>Z_Value</bullet_item><para/>
        ///   <bullet_item>高度</bullet_item><para/>
        ///   <bullet_item>埃列夫</bullet_item><para/>
        ///   <bullet_item>海拔</bullet_item><para/>
        ///   <bullet_item>轮廓</bullet_item><para/>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target Height Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _target_height_field_value _target_height_field { get; set; } = _target_height_field_value.value0;

        public enum _target_height_field_value
        {
            /// <summary>
            /// <para>No Height Source</para>
            /// <para>No Height Source—No Z values will be assigned to the resulting sight line features.</para>
            /// <para>无高度源 - 不会为生成的视线要素指定 Z 值。</para>
            /// </summary>
            [Description("No Height Source")]
            [GPEnumValue("<None>")]
            value0,

        }

        /// <summary>
        /// <para>Join Field</para>
        /// <para><xdoc>
        ///   <para>The join field is used to match observers to specific targets.</para>
        ///   <bulletList>
        ///     <bullet_item>No Join Field—No Z values will be assigned to the resulting sight line features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>连接字段用于将观察点与特定目标进行匹配。</para>
        ///   <bulletList>
        ///     <bullet_item>无连接字段 - 不会为生成的视线要素指定 Z 值。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Join Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _join_field { get; set; } = null;


        /// <summary>
        /// <para>Sampling Distance</para>
        /// <para>The distance between samples when the target is either a line or polygon feature class. The Sampling Distance units are interpreted in the XY units of the output feature class.</para>
        /// <para>当目标为直线或面要素类时，样本之间的距离。采样距离单位以输出要素类的 XY 单位进行解释。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Sampling Distance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _sample_distance { get; set; } = 1;


        /// <summary>
        /// <para>Output The Direction</para>
        /// <para><xdoc>
        ///   <para>Adds direction attributes to the output sight lines. Two additional fields will be added and populated to indicate direction: AZIMUTH and VERT_ANGLE (vertical angle).</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—No direction attributes will be added to the output sight lines. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Two additional fields will be added and populated to indicate direction: azimuth and vertical angle.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将方向属性添加到输出视线。将添加并填充两个额外的字段以指示方向：AZIMUTH 和 VERT_ANGLE（垂直角度）。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 不会向输出视线添加任何方向属性。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 将添加并填充两个附加字段以指示方向：方位角和垂直角度。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output The Direction")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _output_the_direction_value _output_the_direction { get; set; } = _output_the_direction_value._false;

        public enum _output_the_direction_value
        {
            /// <summary>
            /// <para>OUTPUT_THE_DIRECTION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("OUTPUT_THE_DIRECTION")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NOT_OUTPUT_THE_DIRECTION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NOT_OUTPUT_THE_DIRECTION")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Sampling Method</para>
        /// <para><xdoc>
        ///   <para>Specifies how the sampling distance will be used to establish sight lines along the target feature.</para>
        ///   <bulletList>
        ///     <bullet_item>2D distance—The distance will be evaluated in two-dimensional Cartesian space. This is the default.</bullet_item><para/>
        ///     <bullet_item>3D distance—The distance will be evaluated in three-dimensional length.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何使用采样距离沿目标要素建立视线。</para>
        ///   <bulletList>
        ///     <bullet_item>二维距离—将在二维笛卡尔空间中评估距离。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>3D 距离—将以三维长度评估距离。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Sampling Method")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _sampling_method_value _sampling_method { get; set; } = _sampling_method_value._2D_DISTANCE;

        public enum _sampling_method_value
        {
            /// <summary>
            /// <para>2D distance</para>
            /// <para>2D distance—The distance will be evaluated in two-dimensional Cartesian space. This is the default.</para>
            /// <para>二维距离—将在二维笛卡尔空间中评估距离。这是默认设置。</para>
            /// </summary>
            [Description("2D distance")]
            [GPEnumValue("2D_DISTANCE")]
            _2D_DISTANCE,

            /// <summary>
            /// <para>3D distance</para>
            /// <para>3D distance—The distance will be evaluated in three-dimensional length.</para>
            /// <para>3D 距离—将以三维长度评估距离。</para>
            /// </summary>
            [Description("3D distance")]
            [GPEnumValue("3D_DISTANCE")]
            _3D_DISTANCE,

        }

        public ConstructSightLines SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZDomain = null, object ZResolution = null, object ZTolerance = null, int? autoCommit = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZDomain: ZDomain, ZResolution: ZResolution, ZTolerance: ZTolerance, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}